# -*- coding: utf-8 -*-
import time
import io
import sys
from datetime import datetime,timedelta
from anatel_utils import sendMail

date_now = datetime.now()
arquivo_fix = "" + date_now.strftime("%Y-%m-%d") + "_uniq.txt"
estado_array = ['AC','AL','AP','AM','BA','CE','DF','ES','GO','MA','MT','MS','MG','PA','PB','PR','PE','PI','RJ','RN','RS','RO','RR','SC','SP','SE','TO']

def getLineByNumber(line_nbr,file_name):
    linesByNbr=execServerLit("sed -n '%sp' %s" % (line_nbr,file_name))
    #print "linesByNbr: %s" % linesByNbr
    return linesByNbr
    
def getLineCount(file_name):
    linesCount=execServerLit('wc -l %s | cut -d\  -f1' % (file_name))
    return linesCount

def delMatchedLine(line_nbr,file_name):
    print execServerLit("sed --in-place '%sd' %s" % (line_nbr,file_name)) 
     
def getMatchedLine(s1,file_name):
    resposta=execServerLit('grep -n -F "%s" %s' % (s1.replace("\n",""),file_name))    
    try:
        return str(resposta).split(":")[0]
    except:
        return 0    

def execServerLit(command):
    import os
    #print command
    execute_command = os.popen(command,"r")
    return execute_command.read()

def verifica_campos(arquivo_fix):
    #print "levenshtein_file_file"
    
    total_linhas_old = getLineCount(arquivo_fix)
    
    #protecao pra caso algo tenha dado errado no download
    if not (total_linhas_old.strip().isdigit()):
        print total_linhas_old.strip().isdigit()
        print total_linhas_old
        print >> sys.stderr, "Something is seriously wrong."
        sys.exit(1)
    
    file_s1_io  = open(arquivo_fix, "rb")
        
    linhas_novas = []
    linhas_apagar = []
    
    for line_s1 in file_s1_io.readlines():
        
        #limpa linha de sujeira
        line_s1 = line_s1.strip().replace("\n","")
        
        #Verifca se rede tem ","
        if (len(line_s1.split("|"))>50):            
            linhas_apagar.append(line_s1)
            #linhas_apagar.append(getMatchedLine(line_s1,arquivo_fix))
            if line_s1.find("TransmissaoInicial")>-1:
                print "Alert linha com cabecalho de campos. (Apenas apaga)"
            elif not line_s1.split("|")[46] in estado_array:
                linhas_novas.append(("|".join(line_s1.split("|")[:46])+line_s1.split("|")[46]+"|"+"|".join(line_s1.split("|")[47:])))
                print "Alert erro de estado. Estado: %s" % (line_s1.split("|")[46])
            else:
                print "Alert linha com mais de 50 campos."
        elif (len(line_s1.split("|"))<50):
            print "Alert linha com menos de 50 campos."
            print line_s1
                
    
    file_s1_io.close()

        
    #processando
    #primeira apaga as linhas com redes multiplas
    for del_line in linhas_apagar:
        #apaga linha com rede multiplas
        print getLineByNumber(getMatchedLine(del_line,arquivo_fix),arquivo_fix)
        delMatchedLine(getMatchedLine(del_line,arquivo_fix),arquivo_fix)
                
    #adiciona as linhas novas formadas
    for add_line in linhas_novas:   
        print add_line
        file_s1_write  = open(arquivo_fix, "a")
        file_s1_write.write(add_line+"\n")
        file_s1_write.close()
    
    
    
    relat_body = """
    <b>Nome do arquivo:</b> %s \n
    <b>Total de linhas novas:</b> %s \n
    <b>Total de linhas erradas:</b> %s \n
    <b>Total de linhas no arquivo antigo:</b> %s \n
    <b>Total de linhas no arquivo novo:</b> %s \n
    """ % (arquivo_fix,len(linhas_novas),len(linhas_apagar),total_linhas_old,getLineCount(arquivo_fix))
    
    
    sendMail(["wchaves@gmail.com"], "Relatorio de Verificacao de Campos %s" % date_now.strftime("%Y-%m-%d"), relat_body)
    
        
    """ NUMERO DOS CAMPOS:

00 TransmissaoInicial
01 UnidadeFrequenciaTX
02 RecepcaoInicial
03 UnidadeFrequenciaRX
04 Situacao
05 CaraterSecundario
06 IndConfidencial
07 TipoClasseEstacao
08 Horarios
09 DesignacaoEmissao
10 PotenciaOperacao
11 UnidadePotencia
12 Equipamento
13 TipoAntena
14 EquipamentoAntena
15 Ganho
16 FrenteCosta
17 AnguloMeiaPotencia
18 AnguloElevacao
19 Azimute
20 VariacaoAzimutal
21 TipoPolarizacao
22 Altura
23 Raio
24 Latitude
25 Longitude
26 Altitude
27 Estacao
28 Servico
29 Indicativo
30 MedPotenciaMaxima_TR
31 MedLarguraBanda
32 DiametroSGCH
33 Diagrama
34 SiglaEstacao_TRS
35 LongitudeOrbitalSubida
36 NomeFeixeSubida
37 SiglaEstacaoDescida
38 LongitudeOrbitalDescida
39 NomeFeixeDescida
40 TipoEstacao
41 NomeEntidade
42 NumEntidade
43 NomeMunicipio
44 CodMunicipio
45 Endereco
46 UF
47 TipoClasseCorrespondencia
48 Rede
49 Distancia
50 Id

"""      


        
if __name__ == '__main__':
    if not len(sys.argv) < 2:
        
        for v in sys.argv:
            if len(v.split("="))>1:
                param = v.split("=")[0].strip()
                valor = v.split("=")[1].strip()
                try:
                    if param.lower().strip().find("arquivo_fix")>-1:
                        arquivo_fix = valor
                        print "arquivo_fix: %s" % (arquivo_fix)
                        date_now = datetime.strptime(arquivo_fix.split('_')[0], '%Y-%m-%d')                       
                    else:
                        eval('%s=%s' % (param,valor))   
                except:
                    exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
                    print "%s:%s" % (exceptionType,exceptionValue)
    
    
    start_total = time.time()
    
    print "(Comecando!)"
        
    verifica_campos(arquivo_fix)
    
    print "(Total Tempo Gasto: %s)" % ((time.time() - start_total))
